//
//  main.m
//  内存管理
//
//  Created by dllo on 16/7/12.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Man.h"

int main(int argc, const char * argv[]) {
    
       
    //内存问题：
    //内存溢出 内存过多导致溢出，产生Crash
    //野指针（过度释放）
    //指针指向未知区域，指向一块被释放的内存
    //0f0x0afkdsja地址
    //内存管理方式
    //1.垃圾回收机制：只有Mac上有
    //2.Mrc：手动管理引用计数
    //3.arc：自动管理引用计数（现在常用）
    //arc基于mrc管理，系统帮程序员添加了内存管理的内容
    //retain alloc copy需要进行内存管理
//    NSObject *objc = [[NSObject alloc] init];
//    [objc retain];
//    NSObject *objc1 = [NSObject new];
//    [objc release];
//    [objc release];
//    [objc release];
    
    
     //内存管理：引用计数（计数器）
     //有retain alloc copy需要对引用计数加1
    //有release autorelease 会对引用计数 -1
    //当对象的计数器为0的时候，系统会调用对应的dealloc方法
    
    
    //注意：内存管理，你对对象操作完成后，在进行释放
    Man *man = [[Man alloc] init];
//     NSLog(@"%ld",man.retainCount);
//    [man release];
//    [man retain];
//    [man autorelease];
//    [man retain];
    
//     NSLog(@"%@,%ld",man,man.retainCount);
    
    
    //集合类型，会对对象进行引用计数
    //addObject对对象引用计数加1
    //减1
    
    NSMutableArray *array = [NSMutableArray arrayWithObjects:man, nil];
//     NSLog(@"%ld",man.retainCount);
    [array removeAllObjects];
//     NSLog(@"%ld",man.retainCount);
    
    //2.ARC
    //strong(强引用 引用计数加1)
    //weak(对象类型 （NSObject的子类）弱引用，对象被释放时，会自动置空)
    //retain（MRC, 强引用 引用计数加1）
//    assign（应用于简单的数据类型，不会产生引用计数）
//    copy(拷贝，把对象拷贝一份，原来得引用计数不变，新的加1)
    
//    协议
//    1.声明协议，声明协议方法
    //2.签订协议
    //3.实现协议方法
    
    //如果想实现对象的拷贝
    //1签订协议NSCopying
    //2实现协议方法copyWithZone
    //
    //
    [man copy];
    
    //怎么达到
    
    
//    KVC 键值编码，间接访问成员的方式
    
    Man *newMan = [man copy];
     NSLog(@"%@,%@",newMan,man);
    newMan.name = @"离得开飞机";
    newMan.sexual = @"nan";
    
    id name = [newMan valueForKey:@"name"];
    NSLog(@"%@",name);
    [newMan setValue:@"df" forKey:@"name"];
     NSLog(@"%@",newMan.name);
    //
    //
    //valueForKey
    //    //valueForKeyPath
    //setValue: forKey
    //setValue: forKeyPath
   
    Man *gayMan = [[Man alloc]init];
    gayMan.gayBoy = newMan;
    id boyName = [gayMan valueForKeyPath:@"gayBoy.name"];
     NSLog(@"%@",boyName);
    [gayMan release];
    [gayMan setValue:@"李四" forKeyPath:@"gayBoy.name"];
    
     NSLog(@"%@",gayMan.gayBoy.name);
//    NSDictionary *dic = [NSDictionary dictionary];
//    [dic setValue:@"nfe" forKey:@"name"];
//     NSLog(@"%@",dic);
    
    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"123456789",@"id",@"description", nil];
    Man *dicMan = [[Man alloc] init];
    [dicMan setValuesForKeysWithDictionary:dic];
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    return 0;
}
